package bean;

import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.TreeNode;
import org.primefaces.model.DefaultTreeNode;

import entites.Fichier;
import entites.FichierDataModel;

@ManagedBean
@SessionScoped
public class EspacePersoBean {

	private TreeNode root;
	private AppletUtilsBean appUt = new AppletUtilsBean("espacePerso");
	private String newContent = new String();
	private ArrayList<Fichier> fichiers;
	private String lieuEnCours = new String();
	private FichierDataModel modelFichiers;
	private Fichier selectedFiles;
	private final int BUFFER_SIZE = 100000;
	
	private String nouveauDossier = new String();

	public EspacePersoBean() {
		fichiers = new ArrayList<Fichier>();
		modelFichiers = new FichierDataModel(fichiers);
		
		root = new DefaultTreeNode("Root", null);
		lister(root, appUt.getCheminAbsolu());
	}
	
	public void fileUpload(FileUploadEvent event) {
		
		String chemin = lieuEnCours+File.separator+event.getFile().getFileName();
		File nouveauFichier = new File(chemin);
		
		try {
			FileOutputStream fileOutputStream = new FileOutputStream(nouveauFichier);
			byte[] buffer = new byte[BUFFER_SIZE];
			int bulk;
			InputStream inputStream = event.getFile().getInputstream();
			while (true) {
				bulk = inputStream.read(buffer);
				if (bulk < 0) {
				break;
			}
			fileOutputStream.write(buffer, 0, bulk);
			fileOutputStream.flush();
			}
			fileOutputStream.close();
			inputStream.close();
		} catch (IOException e) {}
    } 

	public void lister(TreeNode base, String lieu) {
		File initBase = new File(lieu);

		File[] listeDossiers = initBase.listFiles(new FileFilter() {

			@Override
			public boolean accept(File fichier) {
				return fichier.isDirectory();
			}
		});

		if (listeDossiers != null) {
			for (int i = 0; i < listeDossiers.length; i++) {
				TreeNode nextBase = new DefaultTreeNode(
						listeDossiers[i].getName(), base);
				lister(nextBase,
						lieu + File.separator + listeDossiers[i].getName());
			}
		}
	}
	
	public void ajouterRepertoire() {
		if (!lieuEnCours.isEmpty()) {
			String cheminComplet = appUt.getCheminAbsolu()+File.separator+lieuEnCours+File.separator+nouveauDossier;
			File nouveauDossier = new File(cheminComplet);
			nouveauDossier.mkdir();
			
			viderListeDossier(root);
			lister(root, appUt.getCheminAbsolu());
		}
	}
	
	public void supprimerRepertoire() {
		String cheminComplet = appUt.getCheminAbsolu()+File.separator+lieuEnCours;
		File dossier = new File(cheminComplet);
		dossier.delete();
		
		viderListeDossier(root);
		lister(root, appUt.getCheminAbsolu());
	}
	
	public void viderListeDossier(TreeNode base) {
		root.getChildren().removeAll(root.getChildren());
	}
	
	public void onDirectorySelect(NodeSelectEvent event) {
		
		fichiers.clear();
		
		lieuEnCours = event.getTreeNode().toString();
		
		TreeNode parent = event.getTreeNode().getParent();
		
		while (!parent.toString().equals("Root")) {
			lieuEnCours = parent.toString()+File.separator+lieuEnCours;
			parent = parent.getParent();
		}
		
		String cheminAbsolu = appUt.getCheminAbsolu()+File.separator+lieuEnCours;
		
		File initBase = new File(cheminAbsolu);

		File[] listeFichiers = initBase.listFiles(new FileFilter() {

			@Override
			public boolean accept(File fichier) {
				return !fichier.isDirectory();
			}
		});

		if (listeFichiers != null) {
			for (int i = 0; i < listeFichiers.length; i++) {
				fichiers.add(new Fichier(Integer.toString(i), listeFichiers[i].getName()));
			}
		}
		newContent="";
	}
	
	public void onFileSelect(SelectEvent event) {  
		
		String cheminAcces = lieuEnCours+File.separator+((Fichier) event.getObject()).getNom();
		
		String ext = cheminAcces.substring(cheminAcces.lastIndexOf("."));
		
		if (ext.equals(".jpg") || ext.equals(".jpeg") || ext.equals(".png") || ext.equals(".bmp") || ext.equals(".gif")) {
			newContent = "<img src=\""+"espacePerso"+File.separator+cheminAcces+"\" alt=\"Image introuvable\" />";
		}
		else if (ext.equals(".pdf")) {
			newContent = "<object type=\"application/pdf\" data=\""+"espacePerso"+File.separator+cheminAcces+"\" height=\"600px\" width=\"100%\"> Your browser can't display pdf </object>";
		}
		else if (ext.equals(".mp3") || ext.equals(".wav")) {
			newContent = "<object type=\"application/x-shockwave-flash\" data=\"resources\\dewplayer.swf\" width=\"200\" height=\"20\">" +
					"<param name=\"movie\" value=\"resources\\dewplayer.swf\" />" +
					"<param name=\"FlashVars\" value=\"mp3=espacePerso"+File.separator+cheminAcces+"&amp;autostart=1&amp;showtime=1\" /></object>";
		}
		else if (ext.equals(".avi")) {
			newContent = "<br/><br/><object type=\"application/x-mplayer2\" data=\"espacePerso"+File.separator+cheminAcces+"\" height=\"300\" width=\"250\"><param name=\"url\" value=\"espacePerso"+File.separator+cheminAcces+"\" /><param name=\"autostart\" value=\"false\" />Windows media est recquis</object>";
		}
		else if (ext.equals(".flv")) {
			newContent = "<object type=\"application/x-shockwave-flash\" data=\"resources\\dewtube.swf\" width=\"512\" height=\"384\"> " +
					"<param name=\"movie\" value=\"resources\\dewtube.swf\" />" +
							"<param name=\"flashvars\" value=\"movie=../espacePerso"+File.separator+cheminAcces+"&amp;width=512&amp;height=384&amp;autostart=1\" />" +
									"</object>";
		}
		else {
			newContent = "<div style=\"color:red;\"><h3>Format non pris en charge</h3></div>";
		}
    }

	public TreeNode getRoot() {
		return root;
	}

	public void setRoot(TreeNode root) {
		this.root = root;
	}

	public AppletUtilsBean getAppUt() {
		return appUt;
	}

	public void setAppUt(AppletUtilsBean appUt) {
		this.appUt = appUt;
	}

	public String getNewContent() {
		return newContent;
	}

	public void setNewContent(String newContent) {
		this.newContent = newContent;
	}

	public List<Fichier> getFichiers() {
		return fichiers;
	}

	public void setFichiers(ArrayList<Fichier> fichiers) {
		this.fichiers = fichiers;
	}

	public String getLieuEnCours() {
		return lieuEnCours;
	}

	public void setLieuEnCours(String lieuEnCours) {
		this.lieuEnCours = lieuEnCours;
	}

	public FichierDataModel getModelFichiers() {
		return modelFichiers;
	}

	public Fichier getSelectedFiles() {
		return selectedFiles;
	}

	public void setSelectedFiles(Fichier selectedFiles) {
		this.selectedFiles = selectedFiles;
	}

	public String getNouveauDossier() {
		return nouveauDossier;
	}

	public void setNouveauDossier(String nouveauDossier) {
		this.nouveauDossier = nouveauDossier;
	}
	
	
}